﻿#include <iostream>
#include <fstream>
#include <cstring>
#include <arpa/inet.h>
#include <unistd.h>

#define MULTICAST_ADDR "239.255.0.1" // 多播地址
#define PORT 12345                  // 多播端口
#define CHUNK_SIZE 1024             // 每次发送的块大小

void sendFile(const char* filename) {
    int sock;
    struct sockaddr_in multicastAddr;
    char buffer[CHUNK_SIZE];

    // 创建 UDP 套接字
    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket");
        exit(1);
    }

    // 配置多播地址
    memset(&multicastAddr, 0, sizeof(multicastAddr));
    multicastAddr.sin_family = AF_INET;
    multicastAddr.sin_addr.s_addr = inet_addr(MULTICAST_ADDR);
    multicastAddr.sin_port = htons(PORT);

    // 打开文件
    std::ifstream file(filename, std::ios::binary);
    if (!file.is_open()) {
        perror("打开文件失败");
        close(sock);
        exit(1);
    }

    // 逐块读取文件并发送
    while (!file.eof()) {
        file.read(buffer, CHUNK_SIZE);
        size_t bytesRead = file.gcount();

        if (sendto(sock, buffer, bytesRead, 0, (struct sockaddr*)&multicastAddr, sizeof(multicastAddr)) < 0) {
            perror("sendto");
            break;
        }
    }

    // 发送结束标志
    const char* endMsg = "END";
    sendto(sock, endMsg, strlen(endMsg), 0, (struct sockaddr*)&multicastAddr, sizeof(multicastAddr));

    std::cout << "文件发送完成。" << std::endl;

    file.close();
    close(sock);
}

int main() {
    const char* filename = "largefile.dat"; // 要发送的文件
    sendFile(filename);
    return 0;
}
